<?php if(!defined('CALL')) exit('No direct script access allowed');

include_once('lib/logger.class.php');
include_once('lib/mysql.class.php');
include_once('lib/mailer.class.php');
include_once('lib/utils.class.php');
include_once('cfg/cfg.php');
include_once('view/v_letters.class.php');

class mCandidat
{
	public $props = null;
	private $smtpurl = null;
	public $err_msg = null;
	
	public function __construct()
	{
		global $dburl, $smtpurl, $def_encoding;
		MySQL::$url = $dburl;
		MySQL::$encoding = $def_encoding;
		self::$db = MySQL::getInstance();
		
		$this->smtpurl = $smtpurl;
	}
	
	public function register($find_user_email = TRUE)
	{
		$email = Utils::post_param('email', null);
		$password = Utils::post_param('password', null);

		$busy = 'Почтовый адрес <b>'.$email.'</b> уже занят.';
		// проверка формата email
		if(filter_var($email, FILTER_VALIDATE_EMAIL))
		{
			// проверка длины пароля
			if(strlen($password) > 0)
			{
				$this->load($email);
				// проверять ли существование email у пользователей
				if($find_user_email)
				{
					// если есть пользователь с таким email
					if(!is_null(mUser::get_id($email, null)))
					{
						$this->err_msg = $busy;
						return FALSE;
					}
				}

				// пытаемся записать кандидата в БД
				if($this->insert($email, $password))
				{
					// отправляем ему письмо с уникальной ссылкой
					$this->send_id();
					return TRUE;
				}
				else
				{
					$this->err_msg = $busy;
					return FALSE;
				}
			}
			else
			{
				// пароль не соответсвует требованиям
				$this->err_msg = 'Пароль не может быть пустым!';
				return FALSE;
			}
			
		}
		else
		{
			// email введен неправильно
			$this->err_msg = 'Неверный формат адреса эл.почты: '.$email;
			return FALSE;
		}
	}
	
	public function load($email)
	{
		$this->props = null;
		if($email == null) return;
		
		$sql =
			"SELECT mail, hash, `password`, dt, check_dt ".
			  "FROM candidats ".
			 "WHERE mail = %s";
				
		$params = array(self::$db->escape($email));
		$sql = vsprintf($sql, $params);
		if(LOG_SQL) Logger::Write(__FILE__." ".__FUNCTION__." line: ".__LINE__, $sql);

		$res = self::$db->query($sql);
		if(self::$db->num_rows($res) > 0)
		{
			$row = self::$db->fetch_assoc($res);
			$this->props = $row;
			return TRUE;
		}
		else
			return FALSE;
	}
	
	public function check()
	{
		$sql = "UPDATE candidats SET dt=dt, check_dt = NOW() WHERE mail = %s";
		$params = array(self::$db->escape($this->props['mail']));
		$sql = vsprintf($sql, $params);
		if(LOG_SQL) Logger::Write(__FILE__." ".__FUNCTION__." line: ".__LINE__, $sql);
		self::$db->query($sql);
		return (self::$db->affected_rows() > 0) ? TRUE : FALSE;
	}
	
	public function insert($email, $password)
	{
		// если кандидат еще не был загружен,
		// то надо попробовать его загрузить,
		// чтобы проверить что такой уже есть
		if($this->props == null) $this->load($email);
		
		// если не найден, то INSERT
		if($this->props == null)
		{
			$hash = mUser::get_hash($email);
			$sql = "INSERT INTO candidats(mail, `hash`, `password`) VALUES(%s, %s, %s)";
			$params = array(
				self::$db->escape($email),
				self::$db->escape($hash),
				self::$db->escape($password)
				// self::$db->escape(md5(md5($password).SALT))
				);
			$this->props = array('mail' => $email, 'hash' => $hash, 'password' => '$password');
		}
		// если кандидат с таким email найден, тогда - UPDATE
		else
		{
			$sql = "UPDATE candidats SET `password` = %s, num = num + 1 WHERE mail = %s";
			$params = array(
				// self::$db->escape(md5(md5($password).SALT)),
				self::$db->escape($password),
				self::$db->escape($email)
			);
		}
		
		$sql = vsprintf($sql, $params);
		if(LOG_SQL) Logger::Write(__FILE__." ".__FUNCTION__." line: ".__LINE__, $sql);

		try
		{
			self::$db->query($sql);
			return (self::$db->affected_rows() > 0) ? TRUE : FALSE;
		}
		catch(Exception $e)
		{
			Logger::Write(__FILE__." ".__FUNCTION__." line: ".__LINE__, $e->getMessage());
			return FALSE;
		}
	}
	
	public function delete()
	{
		$sql = "DELETE FROM candidats WHERE mail = %s";
		$params = array(self::$db->escape($this->props['mail']));
		$sql = vsprintf($sql, $params);
		if(LOG_SQL) Logger::Write(__FILE__." ".__FUNCTION__." line: ".__LINE__, $sql);

		try
		{
			self::$db->query($sql);
			return (self::$db->affected_rows() > 0) ? TRUE : FALSE;
		}
		catch(Exception $e)
		{
			Logger::Write(__FILE__." ".__FUNCTION__." line: ".__LINE__, $e->getMessage());
			return FALSE;
		}
	}
	
	public function send_id()
	{
		if(is_null($this->props)) return FALSE;
		
		$msg = vLetters::registration($this->props['mail'], $this->props['hash']);
		
		$subj = 'КогдаКак: Проверка адреса';
		return Mailer::send(array($this->props['mail']), $subj, $msg);
	}
	
	private static $db = null;

}